package fr.charlott.batch.mapper;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindException;

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

import fr.charlott.core.repository.model.Adresse;
import fr.charlott.core.repository.model.Cliente;
import fr.charlott.core.repository.model.Produit;
import fr.charlott.core.repository.model.TailleBas;
import fr.charlott.core.repository.model.TailleHaut;
import fr.charlott.core.service.HotesseService;
import fr.charlott.core.service.ProduitService;

public class ClienteFieldSetMapper implements FieldSetMapper<Cliente>{

	private static final String FIELD_NOM = "nom";
	private static final String FIELD_PRENOM = "prenom";
	private static final String FIELD_ADRESSE = "adresse";
	private static final String FIELD_CODE_POSTAL = "code_postal";
	private static final String FIELD_VILLE = "ville";
	private static final String FIELD_TELEPHONE = "telephone";
	private static final String FIELD_PORTABLE = "portable";
	private static final String FIELD_EMAIL = "email";
	private static final String FIELD_NAISSANCE = "naissance";
	private static final String FIELD_TAILLE_HAUT = "taille_haut";
	private static final String FIELD_TAILLE_BAS = "taille_bas";
	private static final String FIELD_DERNIERE_VISITE = "derniere_visite";
	private static final String FIELD_COMMENTAIRES = "commentaires";
	private static final String FIELD_PREFERENCES = "preferences";
	private static final String FIELD_ACHATS = "achats";
	private static final String FIELD_PRODUITS = "produits";
	private static final String FIELD_INDIVIDUELLE = "individuelle";
	private static final String FIELD_HOTESSE = "hotesse";
	
	private static final String DATE_PATTERN = "dd/mm/yyyy";
	
	@Autowired
	ProduitService produitService;
	
	@Autowired
	HotesseService hotesseService;
	
	@Override
	public Cliente mapFieldSet(FieldSet fieldSet) throws BindException {
		Cliente cliente = new Cliente();
		Adresse adresse = new Adresse();
		
		cliente.setNom(fieldSet.readString(FIELD_NOM));
		cliente.setPrenom(fieldSet.readString(FIELD_PRENOM));
		cliente.setPrenom(fieldSet.readString(FIELD_PRENOM));
		adresse.setNomDeRue(fieldSet.readString(FIELD_ADRESSE));
		adresse.setCodePostal(fieldSet.readString(FIELD_CODE_POSTAL));
		adresse.setVille(fieldSet.readString(FIELD_VILLE));
		adresse.setTelDomicile(fieldSet.readString(FIELD_TELEPHONE));
		adresse.setTelPortable(fieldSet.readString(FIELD_PORTABLE));
		adresse.setEmail(fieldSet.readString(FIELD_EMAIL));
		cliente.setAdresse(adresse);
		if (StringUtils.isNotEmpty(fieldSet.readString(FIELD_NAISSANCE))){
			cliente.setDateDeNaissance(fieldSet.readDate(FIELD_NAISSANCE, DATE_PATTERN));
		}
		cliente.setTailleHaut(TailleHaut.getEnumForValue(fieldSet.readString(FIELD_TAILLE_HAUT)));
		cliente.setTailleBas(TailleBas.getEnumForValue(fieldSet.readString(FIELD_TAILLE_BAS)));
		if (StringUtils.isNotEmpty(fieldSet.readString(FIELD_DERNIERE_VISITE))){
			cliente.setDerniereVisite(fieldSet.readDate(FIELD_DERNIERE_VISITE, DATE_PATTERN));
		}
		cliente.setCommentaires(fieldSet.readString(FIELD_COMMENTAIRES));
		cliente.setPreferences(fieldSet.readString(FIELD_PREFERENCES));
		cliente.setAchats(fieldSet.readString(FIELD_ACHATS));
		List<Produit> produits = Lists.newArrayList();
		Iterable<String> produitsAsString = Splitter.on(",").omitEmptyStrings().trimResults().split(fieldSet.readString(FIELD_PRODUITS));
		for (String produitAsString : produitsAsString) {
			Produit produit = produitService.chercherParReference(produitAsString);
			produits.add(produit);
		}
		cliente.setProduits(produits);
		cliente.setIndividuelle(fieldSet.readBoolean(FIELD_INDIVIDUELLE));
		if (StringUtils.isNotEmpty(fieldSet.readString(FIELD_HOTESSE))) {
			String[] arrayHotesse = StringUtils.split(fieldSet.readString(FIELD_HOTESSE).trim(), ":", 2);
			if (arrayHotesse.length > 0) {
				if (StringUtils.isNotEmpty(arrayHotesse[0]) && StringUtils.isNotEmpty(arrayHotesse[1])){
					cliente.setHotesse(hotesseService.chercherParNomPrenom(arrayHotesse[1], arrayHotesse[0]));
				}
			}
			
		}
		return cliente;
	}

}
